package com.walming.generator.copycat.extend;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.walming.generator.copycat.CriteriaAnnotationProcessorAdvisor;
import com.walming.generator.copycat.enums.ColumnNamingStrategy;
import com.walming.generator.copycat.utils.CriteriaUtils;
import org.apache.commons.lang3.StringUtils;

/**
 * <p>
 * mybatis-plus 抽象查询封装
 * </p>
 *
 * <p> eq 等于 =        </p>
 * <p> ne 不等于 <>     </p>
 * <p> gt 大于 >        </p>
 * <p> ge 大于等于 >=    </p>
 * <p> lt 小于 <        </p>
 * <p> le 小于等于 <=    </p>
 *
 * @author walming
 * @date 2020-10-29 9:04
 */
public abstract class AbstractQuery<T> extends BaseQueryParam {

    /**
     * 根据注解自动包装 QueryWrapper（条件构造器）
     *
     * @return {@link LambdaQueryWrapper}
     */
    public LambdaQueryWrapper<T> autoLambdaWrapper() {
        return autoWrapper().lambda();
    }

    /**
     * 根据条件注解自动包装 QueryWrapper（条件构造器）
     *
     * @return {@link QueryWrapper}
     */
    public QueryWrapper<T> autoWrapper() {
        return CriteriaAnnotationProcessorAdvisor.advise(this, orderWrapper());
    }

    /**
     * 初始化默认全量排序查询条件构造器 <br>
     * 排序列字段命名策略（默认小写字母 && 下划线）
     *
     * @return {@link QueryWrapper}
     */
    private QueryWrapper<T> orderWrapper() {
        return orderWrapper(ColumnNamingStrategy.LOWER_CASE_UNDER_LINE);
    }

    /**
     * 初始化全量排序查询条件构造器 <br>
     * orderByColumn: 排序列，不为空时执行排序，多个用逗号分隔 <br>
     * isAsc: 排序方向（true升序、false倒序） <br>
     * condition: 是否执行排序 <br>
     *
     * @param strategy 数据库字段的命名策略
     * @return {@link QueryWrapper}
     */
    public QueryWrapper<T> orderWrapper(ColumnNamingStrategy strategy) {
        QueryWrapper<T> queryWrapper = new QueryWrapper<>();
        if (StringUtils.isNotEmpty(getOrderByColumn())) {
            String columns = CriteriaUtils.columnName(this.getOrderByColumn(), strategy);
            queryWrapper.orderBy(true, "asc".equals(getIsAsc()), columns.split(","));
        }
        return queryWrapper;
    }

}